IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spRegistroINFORDetalle' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spRegistroINFORDetalle]
END
GO
CREATE PROCEDURE [dbo].[spRegistroINFORDetalle]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL   /* PARAMETRO AUXILIAR */
	,@Id INT=NULL
	,@CodRegistro VARCHAR(16)=NULL
	,@NumeroTransaccion VARCHAR(16)=NULL
	,@LineaLibroGeneral INT=NULL
	,@Periodo VARCHAR(6)=NULL
	,@CodCompromiso VARCHAR(16)=NULL
	,@CodCompromiso_FechaGrab DATETIME=NULL
	,@CodCompromiso_Usuario VARCHAR(32)=NULL
	,@IdTransaccion INT=NULL
	,@TipoTransaccion VARCHAR(4)=NULL
	,@DivisionAdministrativa VARCHAR(16)=NULL
	,@CentroCosto VARCHAR(16)=NULL
	,@UsuarioINFOR VARCHAR(16)=NULL
	,@CuentaContable VARCHAR(16)=NULL
	,@Valor DECIMAL(18,2)=NULL
	,@Moneda VARCHAR(4)=NULL
	,@DescripcionLinea VARCHAR(128)=NULL
	,@DescripcionCabecera VARCHAR(128)=NULL
	,@IdEntidad INT=NULL
	,@FechaDocumento DATE=NULL
	,@FechaEfectiva DATE=NULL
	,@FechaCreacion DATE=NULL
	,@ReferenciaTransaccion VARCHAR(64)=NULL
	,@ReferenciaOrden VARCHAR(16)=NULL
	,@ValorMDF DECIMAL(18,2)=NULL	
	,@NombreEntidad VARCHAR(32)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

DECLARE @AUX VARCHAR(MAX);
DECLARE @indice	INTEGER		--- Esta variable es necesaria para mapear el XML
DECLARE @maxLongitudTemp INTEGER
DECLARE @PrefijoCodCompromiso VARCHAR(16)='CF'
DECLARE @PrefijoCodOrdenCompra VARCHAR(16)='P0'
DECLARE @Registros TABLE	--- En esta variable se grabaran los registros a los que se les va a asociar un compromiso
	(
	 [IdRegistro] int
	,[CodCompromiso] varchar(16)
	,[CodRegistro] varchar(16)
	,[NumeroTransaccion] varchar(16)
	,[LineaLibroGeneral] int
	,[IdTransaccion] int
	,[Valor] Decimal(18,2)
	)
DECLARE @InicialesCodigos TABLE	--- En esta variable se grabaran Los distintos codigos de ordenesCompras o de Contratos asociados a los Compromisos
	(
	  [id] INT IDENTITY(1,1)
	 --,[Codigo] varchar(32)
	 ,[InicioCodigo] varchar(8)
	 ,[MaxLongitud] INT
	)	
create table #Registros_IMPORTADOS
	(	
	 [id] INT IDENTITY(1,1)
	,[CodRegistro] [VARCHAR](16)
	,[CodCompromiso] [VARCHAR](16)
	,[CentroCosto] [VARCHAR](16)
	,[FechaCreacion] [VARCHAR](16)
	,Periodo [VARCHAR](8)
	--,CodPresupuesto [VARCHAR](8)
	,[ReferenciaTransaccion] [VARCHAR](64) -- factura
	,[CuentaContable] [VARCHAR](32)
	,[ReferenciaOrden] [VARCHAR](16) -- Contrato
	,[IdEntidad] [VARCHAR](4)
	,[NombreEntidad] [VARCHAR](32)
	,[DescripcionLinea]  [VARCHAR](128) -- detalle
	,[Valor] NUMERIC(18,2) --[VARCHAR](28)-- NUMERIC(18,2)
	,[VALOR_ANTES] [VARCHAR](28)-- NUMERIC(18,2)
	)


/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[RegistroINFORDetalle] t	
	--where 1=0		
	RETURN 0
END

/*****     IMPORTAR COMPROMISOS DESDE UN EXCEL    *****/
IF @OP = 'IMPORTAR_Registros_EXCEL'
BEGIN
	----------------------------------------------------------------------------------------------
	-- OBTENGO LA INFORMACION DE LOS COMPROMISOS
	----------------------------------------------------------------------------------------------

	EXEC sp_xml_preparedocument @indice OUTPUT, @ParamAuxiliar

	begin try
		INSERT INTO  #Registros_IMPORTADOS
			(
			 [CodRegistro]
			,[CodCompromiso]
			,[CentroCosto]
			,[FechaCreacion]
			,Periodo
			,[ReferenciaTransaccion]
			,[CuentaContable]
			,[ReferenciaOrden]
			,[IdEntidad]
			,[NombreEntidad]
			,[DescripcionLinea]
			,[VALOR_ANTES]
			)
		SELECT --- En esta variable se grabaran los registros que vengan en el XML (ES necesaria para asignarle el consecutivo al Registro)
			 [COD_REGISTRO]
			,[COD_COMPROMISO]
			,[COD_UNIDAD]
			,[FECHAREG]
			,[VIGENCIA]+RIGHT('00'+[PERIODO],2)
			--,'PR'+[VIGENCIA]
			,[COD_FACTURA] 
			,[COD_CUENTA]
			,[COD_CONTRATO]
			,[COD_PROVEEDOR]
			,[NOMBRE_PROVEEDOR]
			,[DETALLE]
			,[VALOR]
		FROM OPENXML(@indice,'/DocumentElement/XML_TABLE',2)WITH 
			(
			 [COD_REGISTRO] [VARCHAR](16)
			,[COD_COMPROMISO] [VARCHAR](16)
			,[COD_UNIDAD] [VARCHAR](16)
			,[FECHAREG] [VARCHAR](16)
			,[PERIODO] [VARCHAR](2)
			,[VIGENCIA] [VARCHAR](4)
			,[COD_FACTURA] [VARCHAR](64)
			,[COD_CUENTA] [VARCHAR](32)
			,[COD_CONTRATO] [VARCHAR](16)
			,[COD_PROVEEDOR] [VARCHAR](4)
			,[NOMBRE_PROVEEDOR] [VARCHAR](32)
			,[DETALLE]  [VARCHAR](128)
			,[VALOR] [VARCHAR](28)-- NUMERIC(18,2)
			)
		--where
		--	[COMPROMISO]<>''
			
		update 
			#Registros_IMPORTADOS 
		set 
			 Valor=CONVERT(NUMERIC(18,0),REPLACE(CASE WHEN VALOR_ANTES='' THEN '0' else VALOR_ANTES end,',','.'))
	end try
	begin catch
		EXEC sp_xml_removedocument @indice	
		SET @AUX='Se presento un error al leer la informacion del excel, verifique que los valores de las columnas FECHAREG y REGISTROS sean correctos.
		ERROR: '+ERROR_MESSAGE()		
		raiserror(@AUX,16,1)
		return
	end catch	
	
	EXEC sp_xml_removedocument @indice	
	
	--- Notifico de aquellos  aquellos compromisos que no se encuentren registrados en el sistema...
	if exists (select * from #Registros_IMPORTADOS t LEFT join Compromiso c on t.codcompromiso=c.CodCompromiso and t.[CodCompromiso]=c.[CodCompromiso] WHERE c.CodCompromiso IS NULL)
	begin
		SET @AUX='Los Siguientes Compromisos No se encuentran registrados en el sistema, verifique: '+ CHAR(10)
		SELECT @AUX= @AUX+'Cod Registro: '+t.codRegistro+' Compromiso: '+t.CodCompromiso from #Registros_IMPORTADOS t LEFT join Compromiso c on t.codcompromiso=c.CodCompromiso and t.[CodCompromiso]=c.[CodCompromiso] WHERE c.CodCompromiso IS NULL
		RAISERROR(@AUX,16,1)
		RETURN 1
	end
	
	--- Notifico de aquellos  CENTROS DE COSTO que no se encuentren registrados en el sistema...
	if exists (select * from #Registros_IMPORTADOS t LEFT join CentroCosto c on t.CentroCosto=c.CodCentroCosto WHERE c.CodCentroCosto IS NULL)
	begin
		SET @AUX='Los Siguientes Centros de costo No se encuentran registrados en el sistema, verifique: '+ CHAR(10)
		SELECT @AUX= @AUX+'Cod Registro: '+t.codRegistro+' Centro Costo: '+t.CentroCosto from #Registros_IMPORTADOS t LEFT join CentroCosto c on t.CentroCosto=c.CodCentroCosto WHERE c.CodCentroCosto IS NULL
		RAISERROR(@AUX,16,1)
		RETURN 1
	end
	
	--- Actualizo los registros que hayan cambiado de Compromiso
	if exists (select * from RegistroINFORDetalle d inner join #Registros_IMPORTADOS t on d.CodRegistro=t.CodRegistro and d.[CodCompromiso]<>t.[CodCompromiso])
	begin
		begin transaction
			-- Obtengo los Registros
			SET @AUX='A Los Siguientes Registros se les ha actualizado el CodCompromiso: 
'
			SELECT @AUX= @AUX+' Registro: '+d.CodRegistro+', CodCompromiso Anterior: '+d.CodCompromiso+', Nuevo CodCompromiso: '+t.codCompromiso+'
' from RegistroINFORDetalle d inner join #Registros_IMPORTADOS t on d.CodRegistro=t.CodRegistro and d.[CodCompromiso]<>t.[CodCompromiso]
			-- grabo en el LOG
			EXEC dbo.spSeguridadLogEventos_Insert @Evento='ACTUALIZACION CodCompromiso en REGISTROS',@Detalle=@AUX	
			
			-- Actulizo los Registros
			UPDATE c
			SET c.CodCompromiso=t.CodCompromiso
			from 
				#Registros_IMPORTADOS t 
				inner join RegistroINFORDetalle c 
					on t.codRegistro=c.codRegistro 
					and c.[CodCompromiso]<>t.[CodCompromiso]
		commit transaction	
	end
	
	--- Actualizo los registros que hayan cambiado de PRECIO
	if exists (select * from RegistroINFORDetalle d inner join #Registros_IMPORTADOS t on d.CodRegistro=t.CodRegistro and d.[Valor]<>t.[Valor])
	begin
		begin transaction
			-- Obtengo los Registros
			SET @AUX='A Los Siguientes Registros se les ha actualizado el VALOR: 
'
			SELECT @AUX= @AUX+' Registro: '+d.CodRegistro+', Valor Anterior: '+dbo.fnFormatoMoneda(d.Valor)+', Nuevo Valor: '+dbo.fnFormatoMoneda(t.Valor)+'
' from RegistroINFORDetalle d inner join #Registros_IMPORTADOS t on d.CodRegistro=t.CodRegistro and d.[Valor]<>t.[Valor]
			-- grabo en el LOG
			EXEC dbo.spSeguridadLogEventos_Insert @Evento='ACTUALIZACION Valor en REGISTROS',@Detalle=@AUX	
			
			-- Actulizo los Registros
			UPDATE c
			SET c.Valor=t.Valor
			from 
				#Registros_IMPORTADOS t 
				inner join RegistroINFORDetalle c 
					on t.codRegistro=c.codRegistro
					and c.[Valor]<>t.[Valor]
		commit transaction	
	end
	
	-- Grabo los datos de cabecera
	INSERT INTO  RegistroINFORCabecera
		(
		 Periodo
		,Usuario
		,Observaciones
		)
	SELECT	DISTINCT
		 t.Periodo
		,dbo.fnGetUsuarioSession() 
		,'Importado desde excel'
	FROM
		#Registros_IMPORTADOS t
		LEFT JOIN RegistroINFORCabecera c
			ON t.Periodo=c.Periodo
	WHERE	
		c.Periodo IS NULL
	
	
	-- Inserto los nuevos registros
	INSERT INTO  RegistroINFORDetalle
		(
		 [CodRegistro]
		,[CodCompromiso]
		,[CentroCosto]
		,[FechaCreacion]
		,Periodo
		,[ReferenciaTransaccion]
		,[CuentaContable]
		,[ReferenciaOrden]
		,[IdEntidad]
		,[NombreEntidad]
		,[DescripcionLinea]
		,Valor
		)
	SELECT	
		 t.[CodRegistro]
		,t.[CodCompromiso]
		,t.[CentroCosto]
		,t.[FechaCreacion]
		,t.Periodo
		,t.[ReferenciaTransaccion]
		,t.[CuentaContable]
		,t.[ReferenciaOrden]
		,t.[IdEntidad]
		,t.[NombreEntidad]
		,t.[DescripcionLinea]
		,t.Valor
	FROM
		#Registros_IMPORTADOS t
		LEFT JOIN RegistroINFORDetalle d
			ON t.CodRegistro=d.CodRegistro
	WHERE	
		d.CodRegistro IS NULL
	
	
	-- Actualizo los saldos de los compromisos y del presupuesto
	IF EXISTS (select top 1 * from  compromiso c inner join  (select codcompromiso,SUM(Valor) as valorRegistros from  RegistroINFORDetalle group by  CodCompromiso ) sq on c.CodCompromiso=sq.CodCompromiso and c.ValorInicialCompromiso-c.SaldoActualCompromiso<>sq.valorRegistros)
	BEGIN
		begin transaction
			-- Obtengo los Compromisos
			SET @AUX='A Los Siguientes Compromisos se les ha actualizado el saldo actual: 
'
			SELECT @AUX= @AUX+' Compromiso: '+c.CodCompromiso+', Saldo Anterior: '+dbo.fnFormatoMoneda(c.SaldoActualCompromiso)+', Nuevo Saldo: '+dbo.fnFormatoMoneda(c.[ValorInicialCompromiso]-sq.ValorRegistros)+'
' from  compromiso c inner join  (select codcompromiso,SUM(Valor) as valorRegistros from  RegistroINFORDetalle group by  CodCompromiso ) sq on c.CodCompromiso=sq.CodCompromiso and c.ValorInicialCompromiso-c.SaldoActualCompromiso<>sq.valorRegistros and c.ValorInicialCompromiso<>c.SaldoActualCompromiso

			-- grabo en el LOG
			EXEC dbo.spSeguridadLogEventos_Insert @Evento='ACTUALIZACION SALDO COMPROMISOS',@Detalle=@AUX	
			
			--print 'ok' rollback transaction return
			-- Actulizo los saldos
			UPDATE c
			SET SaldoActualCompromiso=c.[ValorInicialCompromiso]-sq.ValorRegistros
			from  
				compromiso c 
				inner join  (select codcompromiso,SUM(Valor) as valorRegistros from  RegistroINFORDetalle group by  CodCompromiso ) sq 
					on c.CodCompromiso=sq.CodCompromiso 
					and c.ValorInicialCompromiso-c.SaldoActualCompromiso<>sq.valorRegistros
			-- Actualizo los valores facturados del presupuesto
			update d
			set d.ValorFacturado=sq.ejecutadoRegistros
			from 
				presupuestoanualDetalle d
				inner join 
				(
				select 
					 CodRubro
					,CodPresupuesto 
					,CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN c.CodCentroCosto ELSE cc.CodCentroCostoSuperior END as CodCentroCosto
					,SUM(ValorInicialCompromiso-SaldoActualCompromiso) as ejecutadoRegistros 
				from 
					compromiso c
					inner join CentroCosto cc
						on c.CodCentroCosto=cc.CodCentroCosto
				group by
					 CodRubro
					,CodPresupuesto 
					,CASE WHEN cc.CodCentroCostoSuperior IS NULL THEN c.CodCentroCosto ELSE cc.CodCentroCostoSuperior END
				) sq
					ON d.CodCentroCosto=sq.CodCentroCosto
					and d.CodRubro=sq.CodRubro
					and d.CodPresupuesto=sq.CodPresupuesto	
			-- Recalculo los porcentajes de los rubros del presupuesto
			EXEC spPresupuestoAnualDetalle @OP='RecalcularPorcentajes'			
							
		commit transaction
	END	
	
	--- Grabo la finalizacion del proceso en el log
	SET @AUX='Se realizo la importacion masiva de registros contables desde excel con EXITO!'
	EXEC dbo.spSeguridadLogEventos_Insert @Evento='IMPORTACION REGISTROS DESDE EXCEL',@Detalle=@AUX	
			
		
	drop table #Registros_IMPORTADOS
	RETURN 0
END


/*****     SELECCIONAR REGISTROS DE UN PERIODO DETERMINADO    *****/
IF @OP = 'SelectRegistrosPorPeriodo'
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[RegistroINFORDetalle] t
	WHERE
		t.Periodo=@Periodo
	RETURN 0
END

/*****     SELECCIONAR LOS CRUCES DE REGISTROS Y COMPROMISOS DE UN PERIODO DETERMINADO    *****/
IF @OP = 'SelectRegistrosCruceCompromisosPorPeriodo'
BEGIN
	BEGIN TRANSACTION
	
	-- Con la siguiente conversion valido que el periodo tenga el formato correcto
	SELECT @Periodo=LEFT(ISNULL(@Periodo,'')+'190001',6)
	SELECT @AUX=CONVERT(DATETIME,SUBSTRING(@Periodo,1,4)+'/'+SUBSTRING(@Periodo,5,2)+'/01',111)
	
	
	-- verifico que el periodo haya sido IMPORTADO
	IF NOT EXISTS (SELECT * FROM RegistroINFORCabecera WHERE Periodo=@Periodo)
	BEGIN
		SET @AUX='El periodo '+@Periodo+' NO Ha sido importado Desde INFOR.'	
		RAISERROR(@AUX,16,1)
		return 1
	END
	
	-- Si existe la tabla temporal, Entonces la elimino!
	IF EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE name LIKE '#RegistrosTemp%' AND XTYPE='U')
	BEGIN
		DROP TABLE #RegistrosTemp
	END
	
	-- Guardo los registros en la tabla temporal
	SELECT 
		 t.*
		,t.DescripcionCabecera+'|'+t.DescripcionLinea+'|'+ReferenciaTransaccion AS Campo_Detalle 		
		,ROW_NUMBER() OVER(PARTITION BY t.valor,t.CuentaContable,t.CentroCosto,t.DescripcionLinea+' '+t.NumeroTransaccion  ORDER BY t.id) [Id_Grupo]		
		,t.DescripcionLinea+' '+t.NumeroTransaccion as detalle_temp
	INTO 
		#RegistrosTemp
	FROM
		[dbo].[RegistroINFORDetalle] t
	WHERE
		t.Periodo=@Periodo
		and t.CodCompromiso IS NULL
	
	----------------------------------------------------------------------------------------
	--- Asocio los compromisos a los registros, deacuerdo a distintos criterios de busqueda.	
	----------------------------------------------------------------------------------------
	
	-- A los registros que aun no se les haya asociado un compromiso los filtro por el cod.OrdenCompra, Cod.Contrato para identificar a que compromiso pueden estar asociados
	EXEC sp_Executesql N'EXEC spRegistroINFORDetalle @OP=''AsociarCompromisosARegistros_PorCodOC_CodContrato_CenCosto'''
	-- REESTABLECER LOS CMAPOS DESCRIPTIVOS
	EXEC sp_Executesql N'EXEC spRegistroINFORDetalle @OP=''ReestablecerCamposDescriptivos'''
	
	-- asocio los registros que tengan indicado un codigo de compromiso
	EXEC sp_Executesql N'EXEC spRegistroINFORDetalle @OP=''AsociarCompromisosARegistros_PorCompromiso'''
	-- REESTABLECER LOS CMAPOS DESCRIPTIVOS
	EXEC sp_Executesql N'EXEC spRegistroINFORDetalle @OP=''ReestablecerCamposDescriptivos'''
	
	----------------------------------------------------------------------------------------
	--- FINAL -- Asocio los compromisos a los registros, deacuerdo a distintos criterios de busqueda.	
	----------------------------------------------------------------------------------------
	
	
	select * from #RegistrosTemp where CodCompromiso_Usuario IS NULL
	
	/*
	-- El campo ID de la tabla temporal es un Identity, Las siguientes sentencias son necesarias para actualizar EL ID
	EXEC sp_Executesql N'ALTER TABLE #RegistrosTemp ADD [ID_TEMP] INT'
	EXEC sp_Executesql N'UPDATE #RegistrosTemp SET ID_TEMP = Id'
	EXEC sp_Executesql N'ALTER TABLE #RegistrosTemp DROP COLUMN Id'
	EXEC sp_Executesql N'ALTER TABLE #RegistrosTemp ADD [Id] INT'
	EXEC sp_Executesql N'UPDATE #RegistrosTemp SET Id = ID_TEMP'
	EXEC sp_Executesql N'ALTER TABLE #RegistrosTemp DROP COLUMN ID_TEMP'
	
	----- IMPORTANTE!!!!!... Si el registro ya fue asociado a un compromiso no puede ser actualizado para lograr esto hago ID=ID*-1 cuando CodCompromiso_Usuario IS NOT NULL Osea, cuando ya el usuario asocio un CodCompromiso al registro
	UPDATE 
		temp
	SET 
		temp.id=CASE WHEN temp.CodCompromiso_Usuario IS NOT NULL THEN temp.id*-1 ELSE temp.id END
	FROM 
		#RegistrosTemp temp
		
	--- Retorno los registros temporales
	select * from #RegistrosTemp 
	*/
	
	COMMIT TRANSACTION
	RETURN 0
END

/*****     ASOCIAR COMPROMISOS A LOS REGISTROS CON CODIGO DE COMPROMISO EN EL REGISTRO	*****/
IF @OP = 'AsociarCompromisosARegistros_PorCompromiso'
BEGIN
	-- Si NO existe la tabla temporal, Entonces Muestro el error
	IF NOT EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE name LIKE '#RegistrosTemp%' AND XTYPE='U')
	BEGIN
		SET @ParamAuxiliar='La Operacion "'+@OP+'" Solo puede ser invocada internamente desde el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'".'
		RAISERROR(@ParamAuxiliar,16,1)	
		RETURN 1
	END	

---------------------BORRAR------------------

--select * from temp_borrar where detalle like '%TELEPEAJES ENE-13 CF1301-00045%'
--select * from #RegistrosTemp where Detalle_Temp like '%TELEPEAJES ENE-13 CF1301-00045%'
	UPDATE t2
	set t2.CodCompromiso=t1.codcompromiso
	from 
		temp_borrar t1
		inner join #RegistrosTemp t2
			on t1.cuenta=t2.CuentaContable
			and t1.cc=t2.CentroCosto
			and t1.valor=t2.Valor
			and t1.detalle=t2.Detalle_Temp
			and t1.id=t2.id_grupo	
			AND t2.CodCompromiso IS NULL
return
	
---------------------FIN BORRAR--------------

	
	--Bueno, lo primero es encontrar aquellos registros qu etengan algun codigo de compromisos en la descripcion (Cabecera o Detalle) y/o en la Referencia de la transaccion.
	UPDATE 
		#RegistrosTemp
	SET 
		 Campo_Detalle=SUBSTRING(Campo_Detalle,CHARINDEX(@PrefijoCodCompromiso,Campo_Detalle),(LEN(Campo_Detalle)-CHARINDEX(@PrefijoCodCompromiso,Campo_Detalle)+1))
	
	----------------
	---El primer formato de busqueda es FC####-###### (10 Digitos)
	----------------
		
	
	UPDATE #RegistrosTemp SET 
		CodCompromiso=
		CASE
			WHEN ISNUMERIC(SUBSTRING(Campo_Detalle,3,4))=1 AND ISNUMERIC(SUBSTRING(Campo_Detalle,8,6))=1 THEN SUBSTRING(Campo_Detalle,1,13)
			ELSE NULL
		END	
	WHERE 
		LEN(Campo_Detalle)>=13 
		AND LEFT(Campo_Detalle,2)=@PrefijoCodCompromiso
		AND CodCompromiso IS NULL
		
	----------------
	---El segundo formato de busqueda es FC####-##### (9 Digitos)
	----------------
	
	UPDATE #RegistrosTemp SET 
		CodCompromiso=
		CASE
			WHEN ISNUMERIC(SUBSTRING(Campo_Detalle,3,4))=1 AND ISNUMERIC(SUBSTRING(Campo_Detalle,8,5))=1 THEN SUBSTRING(Campo_Detalle,1,12)
			ELSE NULL
		END	
	WHERE 
		LEN(Campo_Detalle)>=12 
		AND LEFT(Campo_Detalle,2)=@PrefijoCodCompromiso
		AND CodCompromiso IS NULL
		
	----------------
	---El tercero formato de busqueda es FC####-#### (8 Digitos)
	----------------
	
	UPDATE #RegistrosTemp SET 
		CodCompromiso=
		CASE
			WHEN ISNUMERIC(SUBSTRING(Campo_Detalle,3,4))=1 AND ISNUMERIC(SUBSTRING(Campo_Detalle,8,4))=1 THEN SUBSTRING(Campo_Detalle,1,11)
			ELSE NULL
		END	
	WHERE 
		LEN(Campo_Detalle)>=11 
		AND LEFT(Campo_Detalle,2)=@PrefijoCodCompromiso
		AND CodCompromiso IS NULL
		
	----------------
	---El cuarto formato de busqueda es FC######### (9 Digitos)
	----------------
	
	UPDATE #RegistrosTemp SET 
		CodCompromiso=
		CASE
			WHEN ISNUMERIC(SUBSTRING(Campo_Detalle,3,9))=1 THEN SUBSTRING(Campo_Detalle,1,11)
			ELSE NULL
		END	
	WHERE 
		LEN(Campo_Detalle)>=11 
		AND LEFT(Campo_Detalle,2)=@PrefijoCodCompromiso
		AND CodCompromiso IS NULL
	
	----------------
	---El quinto formato de busqueda es FC######## (8 Digitos)
	----------------
	
	UPDATE #RegistrosTemp SET 
		CodCompromiso=
		CASE
			WHEN ISNUMERIC(SUBSTRING(Campo_Detalle,3,8))=1 THEN SUBSTRING(Campo_Detalle,1,10)
			ELSE NULL
		END	
	WHERE 
		LEN(Campo_Detalle)>=10 
		AND LEFT(Campo_Detalle,2)=@PrefijoCodCompromiso
		AND CodCompromiso IS NULL
	
	RETURN 0
END

/*****     ASOCIAR COMPROMISOS A LOS REGISTROS CON CODIGOS DE CONTRATOS O ORDENES DE COMPRA EN LA DESCRIPCION	*****/
IF @OP = 'AsociarCompromisosARegistros_PorCodOC_CodContrato_CenCosto'
BEGIN
	-- Si NO existe la tabla temporal, Entonces Muestro el error
	IF NOT EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE name LIKE '#RegistrosTemp%' AND XTYPE='U')
	BEGIN
		SET @ParamAuxiliar='La Operacion "'+@OP+'" Solo puede ser invocada internamente desde el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'".'
		RAISERROR(@ParamAuxiliar,16,1)	
		RETURN 1
	END	
	
	/*
	-- obtengo las distintas iniciales de los codigos de ordenes de compra y contratos y su maxima logitud (Para poder buscar en los registros)
	INSERT INTO @InicialesCodigos
		(InicioCodigo,MaxLongitud)
	SELECT DISTINCT 
		SUBSTRING(CodContrato,1,4),LEN(CodContrato)
	FROM 
		Compromiso 	
	WHERE 
		CodCompromiso_REVERSION IS NULL
		AND EsReversion=0
		AND SaldoActualCompromiso<>0
		AND CodContrato IS NOT NULL
	UNION SELECT DISTINCT 
		SUBSTRING(CodOrdenCompra,1,4),LEN(CodOrdenCompra)
	FROM 
		Compromiso 
	WHERE 
		CodCompromiso_REVERSION IS NULL
		AND EsReversion=0
		AND SaldoActualCompromiso<>0
		AND CodOrdenCompra IS NOT NULL
	
	--select * from @InicialesCodigos
	
	-- Bueno ahora debo hacer un ciclo para ir corriendo los registros contables del periodo e ir identiicando los registros a los que tienen digitados cada uno de los iniciales
	SELECT @indice=MIN(ID) from @InicialesCodigos
	WHILE @indice<=( SELECT MAX(ID) from @InicialesCodigos)
	BEGIN
		-- Obtengo las iniciales del codigo y la longitud del mismo
		SELECT	@PrefijoCodCompromiso=InicioCodigo, @maxLongitudTemp=MaxLongitud
		FROM	@InicialesCodigos
		WHERE	ID=@indice		
		
		-- recorto los campos descriptivos donde corresponda
		UPDATE 
			#RegistrosTemp
		SET 
			 Campo_Detalle=SUBSTRING(Campo_Detalle,CHARINDEX(@PrefijoCodCompromiso,Campo_Detalle),(LEN(Campo_Detalle)-CHARINDEX(@PrefijoCodCompromiso,Campo_Detalle)+1))
		
		-- recorto los campos descriptivos donde corresponda
		UPDATE #RegistrosTemp SET 
			 Campo_Detalle=LEFT(Campo_Detalle,@maxLongitudTemp)
			,CodCompromiso='AWILCHES'			
		WHERE
			LEN(Campo_Detalle)>=@maxLongitudTemp 
			AND LEFT(Campo_Detalle,LEN(@PrefijoCodCompromiso))=@PrefijoCodCompromiso
			AND CodCompromiso IS NULL
		
		-- PASO AL SIGUIENTE indice
		SET @indice=@indice+1
	END
	*/

	-- Hago las comparaciones por DESCRIPCION, Codigo (de OC o de Contrato), por el centro de costo, Por el Nombre del proveedor, Por Valor
	UPDATE	temp SET temp.CodCompromiso=c.CodCompromiso		 
	FROM 
		#RegistrosTemp temp
		INNER JOIN Compromiso c
			ON 
				c.SaldoActualCompromiso<>0
				AND LEFT(c.CodCentroCosto,3)=LEFT(temp.CentroCosto,3)			
				AND temp.Valor=c.SaldoActualCompromiso
				AND temp.Campo_Detalle = c.Observaciones
				AND temp.NombreEntidad LIKE '%'+LEFT(c.NombreProveedor,5)+'%'
				AND 
				( 
					temp.Campo_Detalle LIKE '%'+c.CodContrato+'%'
					OR
					temp.Campo_Detalle LIKE '%'+c.CodOrdenCompra+'%'
				)	
				AND temp.codcompromiso IS NULL
				--AND ( (temp.codcompromiso IS NULL AND ISNULL(temp.referenciaOrden,'')<>'') OR temp.codcompromiso='AWILCHES' )
				AND C.CodCompromiso_REVERSION IS NULL 
				AND c.EsReversion=0
				-- Si una orden de compra tiene asociado mas de un compromiso en el mismo centro de cosoto, entonces NO le coloco el codigo del COPROMISO
				AND c.CodSolicitud NOT IN (SELECT DISTINCT CodSolicitud FROM Compromiso WHERE CodCompromiso_REVERSION IS NULL  AND EsReversion=0 AND CodOrdenCompra IS NOT NULL GROUP BY CodSolicitud,CodCentroCosto HAVING COUNT(*)>1)

	-- Hago las comparaciones por Codigo (de OC o de Contrato), por el centro de costo, Por el Nombre del proveedor, Por Valor
	UPDATE	temp SET temp.CodCompromiso=c.CodCompromiso		 
	FROM 
		#RegistrosTemp temp
		INNER JOIN Compromiso c
			ON 
				c.SaldoActualCompromiso<>0
				AND LEFT(c.CodCentroCosto,3)=LEFT(temp.CentroCosto,3)			
				AND temp.Valor=c.SaldoActualCompromiso
				AND temp.NombreEntidad LIKE '%'+LEFT(c.NombreProveedor,5)+'%'
				AND 
				( 
					temp.Campo_Detalle LIKE '%'+c.CodContrato+'%'
					OR
					temp.Campo_Detalle LIKE '%'+c.CodOrdenCompra+'%'
				)	
				AND temp.codcompromiso IS NULL
				--AND ( (temp.codcompromiso IS NULL AND ISNULL(temp.referenciaOrden,'')<>'') OR temp.codcompromiso='AWILCHES' )
				AND C.CodCompromiso_REVERSION IS NULL 
				AND c.EsReversion=0
				-- Si una orden de compra tiene asociado mas de un compromiso en el mismo centro de cosoto, entonces NO le coloco el codigo del COPROMISO
				AND c.CodSolicitud NOT IN (SELECT DISTINCT CodSolicitud FROM Compromiso WHERE CodCompromiso_REVERSION IS NULL  AND EsReversion=0 AND CodOrdenCompra IS NOT NULL GROUP BY CodSolicitud,CodCentroCosto HAVING COUNT(*)>1)

	-- Hago las comparaciones por Codigo (de OC o de Contrato), por el centro de costo, Por el Nombre del proveedor
	UPDATE	temp SET temp.CodCompromiso=c.CodCompromiso		 
	FROM 
		#RegistrosTemp temp
		INNER JOIN Compromiso c
			ON 
				c.SaldoActualCompromiso<>0
				AND LEFT(c.CodCentroCosto,3)=LEFT(temp.CentroCosto,3)			
				--AND temp.Valor=c.SaldoActualCompromiso
				AND temp.NombreEntidad LIKE '%'+LEFT(c.NombreProveedor,5)+'%'
				AND 
				( 
					temp.Campo_Detalle LIKE '%'+c.CodContrato+'%'
					OR
					temp.Campo_Detalle LIKE '%'+c.CodOrdenCompra+'%'
				)	
				AND temp.codcompromiso IS NULL
				--AND ( (temp.codcompromiso IS NULL AND ISNULL(temp.referenciaOrden,'')<>'') OR temp.codcompromiso='AWILCHES' )
				AND C.CodCompromiso_REVERSION IS NULL 
				AND c.EsReversion=0
				-- Si una orden de compra tiene asociado mas de un compromiso en el mismo centro de cosoto, entonces NO le coloco el codigo del COPROMISO
				AND c.CodSolicitud NOT IN (SELECT DISTINCT CodSolicitud FROM Compromiso WHERE CodCompromiso_REVERSION IS NULL  AND EsReversion=0 AND CodOrdenCompra IS NOT NULL GROUP BY CodSolicitud,CodCentroCosto HAVING COUNT(*)>1)

	-- Hago las comparaciones por Codigo (de OC o de Contrato), por el centro de costo, Por el Nombre del proveedor (Menos Caracteres)
	UPDATE	temp SET temp.CodCompromiso=c.CodCompromiso		 
	FROM 
		#RegistrosTemp temp
		INNER JOIN Compromiso c
			ON 
				c.SaldoActualCompromiso<>0
				AND LEFT(c.CodCentroCosto,3)=LEFT(temp.CentroCosto,3)
				--AND temp.Valor=c.SaldoActualCompromiso
				AND temp.NombreEntidad LIKE '%'+LEFT(c.NombreProveedor,5)+'%'
				AND 
				( 
					temp.Campo_Detalle LIKE '%'+c.CodContrato+'%'
					OR
					temp.Campo_Detalle LIKE '%'+c.CodOrdenCompra+'%'
				)	
				AND temp.codcompromiso IS NULL
				--AND ( (temp.codcompromiso IS NULL AND ISNULL(temp.referenciaOrden,'')<>'') OR temp.codcompromiso='AWILCHES' )
				AND C.CodCompromiso_REVERSION IS NULL 
				AND c.EsReversion=0
				-- Si una orden de compra tiene asociado mas de un compromiso en el mismo centro de cosoto, entonces NO le coloco el codigo del COPROMISO
				AND c.CodSolicitud NOT IN (SELECT DISTINCT CodSolicitud FROM Compromiso WHERE CodCompromiso_REVERSION IS NULL  AND EsReversion=0 AND CodOrdenCompra IS NOT NULL GROUP BY CodSolicitud,CodCentroCosto HAVING COUNT(*)>1)
				
	-- Hago las comparaciones por Codigo (de OC o de Contrato), por el centro de costo
	UPDATE	temp SET temp.CodCompromiso=c.CodCompromiso		 
	FROM 
		#RegistrosTemp temp
		INNER JOIN Compromiso c
			ON 
				c.SaldoActualCompromiso<>0
				AND LEFT(c.CodCentroCosto,3)=LEFT(temp.CentroCosto,3)
				--AND temp.Valor=c.SaldoActualCompromiso
				--AND temp.NombreEntidad LIKE '%'+LEFT(c.NombreProveedor,5)+'%'
				AND 
				( 
					temp.Campo_Detalle LIKE '%'+c.CodContrato+'%'
					OR
					temp.Campo_Detalle LIKE '%'+c.CodOrdenCompra+'%'
				)	
				AND temp.codcompromiso IS NULL
				--AND c.CodCompromiso NOT IN (SELECT DISTINCT CodCompromiso FROM #RegistrosTemp where CodCompromiso<>'AWILCHES' AND CodCompromiso IS NOT NULL)	
				AND C.CodCompromiso_REVERSION IS NULL 
				AND c.EsReversion=0
				-- Si una orden de compra tiene asociado mas de un compromiso en el mismo centro de cosoto, entonces NO le coloco el codigo del COPROMISO
				AND c.CodSolicitud NOT IN (SELECT DISTINCT CodSolicitud FROM Compromiso WHERE CodCompromiso_REVERSION IS NULL  AND EsReversion=0 AND CodOrdenCompra IS NOT NULL GROUP BY CodSolicitud,CodCentroCosto HAVING COUNT(*)>1)
				
/*					
	
	-- Coloco CodCompromiso=NULL en aquellos registros que quedaron con el "AWILCHES"
	UPDATE #RegistrosTemp
	SET CodCompr
	omiso=NULL
	WHERE CodCompromiso='AWILCHES'
	
	*/			
	
	RETURN 0
END

/*****  REESTABLEZCO LOS CAMPOS DESCRIPTIVOS (LOS CAMPOS "DESCRIPCIONCABECERA", "DESCRIPCIONLINEA", "REFERENCIATRANSACCION" SE CAMBIAN PARA ASOCIAR LOS CODIGOS DE COMPROMISOS      *****/
IF @OP = 'ReestablecerCamposDescriptivos'
BEGIN
	BEGIN TRANSACTION

	-- Si NO existe la tabla temporal, Entonces Muestro el error
	IF NOT EXISTS (SELECT NAME FROM tempdb..sysobjects WHERE name LIKE '#RegistrosTemp%' AND XTYPE='U')
	BEGIN
		SET @ParamAuxiliar='La Operacion "'+@OP+'" Solo puede ser invocada internamente desde el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'".'
		RAISERROR(@ParamAuxiliar,16,1)	
		RETURN 1
	END	
	
	--- Reestablezco los campos Descriptivos (los campos "DescripcionCabecera", "DescripcionLinea", "ReferenciaTransaccion" se cambiaron en el @OP='AsociarCompromisosARegistros' para relaizar la asociacion de los CodCompromisos)
	UPDATE 
		temp
	SET 
		 temp.Campo_Detalle=t.DescripcionCabecera+t.DescripcionLinea+t.ReferenciaTransaccion
		 ,temp.ReferenciaTransaccion=t.ReferenciaTransaccion
	FROM 
		#RegistrosTemp temp
		INNER JOIN [dbo].[RegistroINFORDetalle] t
			ON  temp.NumeroTransaccion=t.NumeroTransaccion
			AND temp.LineaLibroGeneral=t.LineaLibroGeneral
			AND temp.Valor=t.Valor
	
	COMMIT TRANSACTION			
	RETURN 0
END

/*****  GUARDAR LOS COMPROMISOS ASOCIADOS A LO REGISTROS      *****/
IF @OP = 'GuardarRegistrosCruceCompromisosPorPeriodo'
BEGIN
	BEGIN TRANSACTION
	
	-- Verifico si el presupuesto se encuentre Activo
	IF NOT EXISTS (SELECT CodPresupuesto from PresupuestoAnualCabecera WHERE Vigencia=CONVERT(INT,SUBSTRING(@Periodo,1,4)) AND Activo=1)
	BEGIN
		SELECT @AUX='El presupuesto '+CodPresupuesto+' NO se encuentra Activo.' from PresupuestoAnualCabecera WHERE Vigencia=CONVERT(INT,SUBSTRING(@Periodo,1,4))
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	----------------------------------------------------------------------------------------------------------------------------------------------------------------
	-- Se supone que los registros que no se pueden editar vienen con el campo ID<0, Bajo este supuesto PODEMOS ESTAR SEGUROS de que estos registros no podran ser editados
	----------------------------------------------------------------------------------------------------------------------------------------------------------------
	
	--Obtengo los registros que seran actualizados
	EXEC sp_xml_preparedocument @indice OUTPUT, @ParamAuxiliar
	
	INSERT INTO @Registros 
		(IdRegistro,CodRegistro,CodCompromiso,NumeroTransaccion,LineaLibroGeneral,IdTransaccion,Valor)
	SELECT 
		[Id],[CodRegistro],[CodCompromiso],[NumeroTransaccion],[LineaLibroGeneral],[IdTransaccion],CONVERT(DECIMAL(18,2),REPLACE([Valor],',','.'))
	FROM OPENXML(@indice,'/DocumentElement/XML_TABLE',2)WITH 
	(
	  [Id] INT
	 ,[CodRegistro] VARCHAR(16)
	 ,[CodCompromiso] VARCHAR(16)
	 ,[NumeroTransaccion] varchar(16)
	 ,[LineaLibroGeneral] int
	 ,[IdTransaccion] int
	 ,[Valor] VARCHAR(16)
	)
	
	EXEC sp_xml_removedocument @indice	

/*
------------------BORRAR!!!!---------------------
declare @BORRAME table(id int ,codcompromiso varchar(16))
insert 
	into @BORRAME (id,codcompromiso)
SELECT 
	  MIN(r.IdRegistro)
	 ,r.codCompromiso	 
from  
	@Registros r
	INNER JOIN Compromiso c
		on r.CodCompromiso=c.CodCompromiso
GROUP BY
	r.codCompromiso
HAVING					
	MAX(c.SaldoActualCompromiso)>0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)<0
UNION 
	SELECT 
	  MIN(r.IdRegistro)
	 ,r.codCompromiso	 
from  
	@Registros r
	INNER JOIN Compromiso c
		on r.CodCompromiso=c.CodCompromiso
GROUP BY
	r.codCompromiso
HAVING					
	MAX(c.SaldoActualCompromiso)<0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)>0	

update t1 set IdRegistro=-IdRegistro from @Registros t1 inner join  @BORRAME t2 on t1.CodCompromiso=t2.codcompromiso and t1.IdRegistro<>t2.id

	delete from @BORRAME 
	insert 
		into @BORRAME (id,codcompromiso)
	SELECT 
		  MIN(r.IdRegistro)
		 ,r.codCompromiso	 
	from  
		@Registros r
		INNER JOIN Compromiso c
			on r.CodCompromiso=c.CodCompromiso
	where 
		IdRegistro>0		
	GROUP BY
		r.codCompromiso
	HAVING					
		MAX(c.SaldoActualCompromiso)>0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)<0
	UNION
		SELECT 
		  MIN(r.IdRegistro)
		 ,r.codCompromiso	 
	from  
		@Registros r
		INNER JOIN Compromiso c
			on r.CodCompromiso=c.CodCompromiso
	where 
		IdRegistro>0		
	GROUP BY
		r.codCompromiso
	HAVING					
		MAX(c.SaldoActualCompromiso)<0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)>0

update t1 set IdRegistro=-IdRegistro from @Registros t1 inner join  @BORRAME t2 on t1.CodCompromiso=t2.codcompromiso and t1.IdRegistro=t2.id

--select t1.* from @Registros t1 inner join  @BORRAME t2 on t1.CodCompromiso=t2.codcompromiso and t1.IdRegistro<>t2.id
------------------FIN BORRAR!!!!---------------------
*/
	
	-- Elimino los registros que no aplican
	DELETE FROM @Registros WHERE  IdRegistro<0 OR CodCompromiso IS NULL  OR RTRIM(CodCompromiso)=''
	
	
	-- Verifico Si Se digitaron compromisos que NO estan registrados en el sistema
	IF dbo.fnGetValorParametro('MostrarErrorCompromisosNoExistentesCruceRegistros')='SI'
	BEGIN
		IF EXISTS (select top 1 c.CodCompromiso,r.* 
						from  
							@Registros r
							left join Compromiso c
								on r.CodCompromiso=c.CodCompromiso
						WHERE 
							c.CodCompromiso IS NULL
				  )
		BEGIN
			SET @AUX='Los siguiente(s) Compromiso(s) NO Esta(n) registrado(s) en el sistema:	'+CHAR(10)
			SELECT @AUX=@AUX+' - '+r.CodCompromiso+', Cod.Registro: '+r.CodRegistro+', Num.Transac: '+CONVERT(VARCHAR(16),r.NumeroTransaccion)+', Id.Transac: '+CONVERT(VARCHAR(16),r.IdTransaccion)+'
	'			from  
					@Registros r
					left join Compromiso c
						on r.CodCompromiso=c.CodCompromiso
				WHERE 
					c.CodCompromiso IS NULL
			
			RAISERROR(@AUX,16,1)
			RETURN 1
		END	
	END
	ELSE
	BEGIN
		DELETE  FROM @Registros WHERE IdRegistro IN (select r.IdRegistro from   @Registros r left join Compromiso c on r.CodCompromiso=c.CodCompromiso WHERE  c.CodCompromiso IS NULL)
	END
	
	-- Verifico si se han digitado compromisos revertidos
	IF EXISTS (select top 1 c.CodCompromiso,r.* 
						from  
							@Registros r
							inner join Compromiso c
								on r.CodCompromiso=c.CodCompromiso
						WHERE 
							c.CodCompromiso_REVERSION IS NOT NULL
							OR  c.EsReversion=1
				  )
		BEGIN
			SET @AUX='Los siguiente(s) Compromiso(s) Estan revertidos, NO puede asociarle registros:'+CHAR(10)
			SELECT @AUX=@AUX+' - '+r.CodCompromiso+', Cod.Registro: '+r.CodRegistro+', Num.Transac: '+CONVERT(VARCHAR(16),r.NumeroTransaccion)+', Id.Transac: '+CONVERT(VARCHAR(16),r.IdTransaccion)+'
	'			from  
					@Registros r
					inner join Compromiso c
						on r.CodCompromiso=c.CodCompromiso
				WHERE 
					c.CodCompromiso_REVERSION IS NOT NULL
					OR  c.EsReversion=1
			RAISERROR(@AUX,16,1)
			RETURN 1
		END
	
	-- verifico si hay registros que hacen que compromisos con saldo DEBITO queden acreditados
	IF EXISTS (SELECT TOP 1 r.codCompromiso
					from  
						@Registros r
						INNER JOIN Compromiso c
							on r.CodCompromiso=c.CodCompromiso
					GROUP BY
						r.codCompromiso
					HAVING					
						MAX(c.SaldoActualCompromiso)>0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)<0
			  )
	BEGIN
		SET @AUX='Los siguiente(s) compromiso(s) quedan con saldo CREDITO. Verifique:'+CHAR(10)
		SELECT @AUX=@AUX+'	- CodCompromiso: '+r.CodCompromiso+', Valor Compromiso: $'+dbo.fnFormatoMoneda(MAX(c.ValorInicialCompromiso))+', Saldo Compromiso: $'+dbo.fnFormatoMoneda(MAX(c.SaldoActualCompromiso))+', Val. Registros: $'+dbo.fnFormatoMoneda(SUM(r.Valor))+'
'			from  
				@Registros r
				INNER JOIN Compromiso c
					on r.CodCompromiso=c.CodCompromiso
			GROUP BY
				r.codCompromiso
			HAVING					
				MAX(c.SaldoActualCompromiso)>0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)<0
		RAISERROR(@AUX,16,1)
		RETURN 1
	END	
	
	-- verifico si hay registros que hacen que compromisos con saldo CREDITO queden debitados
	IF EXISTS (SELECT TOP 1 r.codCompromiso
					from  
						@Registros r
						INNER JOIN Compromiso c
							on r.CodCompromiso=c.CodCompromiso
					GROUP BY
						r.codCompromiso
					HAVING					
						MAX(c.SaldoActualCompromiso)<0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)>0									
			  )
	BEGIN
		SET @AUX='Los siguiente(s) compromiso(s) quedan con saldo DEBITO. Verifique:'+CHAR(10)
		SELECT @AUX=@AUX+'	- CodCompromiso: '+r.CodCompromiso+', Valor Compromiso: $'+dbo.fnFormatoMoneda(MAX(c.ValorInicialCompromiso))+', Saldo Compromiso: $'+dbo.fnFormatoMoneda(MAX(c.SaldoActualCompromiso))+', Val. Registros: $'+dbo.fnFormatoMoneda(SUM(r.Valor))+'
'			from  
				@Registros r
				INNER JOIN Compromiso c
					on r.CodCompromiso=c.CodCompromiso
			GROUP BY
				r.codCompromiso
			HAVING					
				MAX(c.SaldoActualCompromiso)<0 AND MAX(c.SaldoActualCompromiso)-SUM(r.Valor)>0									
		RAISERROR(@AUX,16,1)
		RETURN 1
	END	
	
		
	-- verifico si hay compromisos creados en periodos posteriores al indicado
	IF EXISTS (SELECT TOP 1 *
					from  
						@Registros r
						INNER JOIN Compromiso c
							on r.CodCompromiso=c.CodCompromiso
					WHERE
						NOT SUBSTRING(r.CodCompromiso,3,4) BETWEEN SUBSTRING(@Periodo,3,2)+'01' AND SUBSTRING(@Periodo,3,4)
			  )
	BEGIN
		SET @AUX='Los siguiente(s) Compromiso(s) NO Fueron creados entre '+SUBSTRING(@Periodo,1,4)+'01 y '+@Periodo+' :'+CHAR(10)
			SELECT @AUX=@AUX+'	- CodCompromiso: '+r.CodCompromiso+', Periodo del Compromiso: 20'+SUBSTRING(r.CodCompromiso,3,4)+'
'			from  
				@Registros r
				INNER JOIN Compromiso c
					on r.CodCompromiso=c.CodCompromiso
			WHERE
				NOT SUBSTRING(r.CodCompromiso,3,4) BETWEEN SUBSTRING(@Periodo,3,2)+'01' AND SUBSTRING(@Periodo,3,4)
		RAISERROR(@AUX,16,1)
		RETURN 1
	END	
	
	-- Actualizo los datos del compromiso en el registro		
	UPDATE det
	SET
		 det.codCompromiso=reg.CodCompromiso
		,det.CodCompromiso_FechaGrab=GETDATE()
		,det.CodCompromiso_Usuario=dbo.fnGetUsuarioSession()	
	FROM
		RegistroINFORDetalle det
		INNER JOIN  @Registros reg		
			ON  det.Id=reg.IdRegistro
	
	-- Resto el valor del registro al compromiso y actualizo la fecha de ultima modificacion
	UPDATE 
		c
	SET 
		 c.SaldoActualCompromiso=c.SaldoActualCompromiso-r.Valor
		,c.FechaUltMod=GETDATE()
	FROM
		(
			SELECT 
				 reg.CodCompromiso
				,SUM(reg.Valor) AS Valor
			FROM 
				@Registros reg
			GROUP BY
				reg.CodCompromiso		
		) r
		INNER JOIN Compromiso c
			ON r.CodCompromiso=c.CodCompromiso
	
	-- Sumo el valor del registro al valorFacturado del Presupuesto-rubro-CentroCosto correspondiente al compromiso
	UPDATE 
		pd
	SET 
		 pd.ValorFacturado=pd.ValorFacturado+Table1.Valor
	FROM
		(
			SELECT
				 c.CodPresupuesto
				,c.CodRubro
				,c.CodCentroCosto
				,SUM(r.Valor) AS Valor
			FROM	
				(
					SELECT 
						 reg.CodCompromiso
						,SUM(reg.Valor) AS Valor
					FROM 
						@Registros reg
					GROUP BY
						reg.CodCompromiso		
				) r
				INNER JOIN 
				(
					select 
						 comp.CodCompromiso
						,comp.CodPresupuesto
						,comp.CodRubro
						,CASE WHEN cc.CodCentroCostoSuperior IS NOT NULL THEN cc.CodCentroCostoSuperior ELSE cc.CodCentroCosto END AS CodCentroCosto					
					from 
						Compromiso comp
						inner join CentroCosto cc
							on comp.CodCentroCosto=cc.CodCentroCosto				
				) c
				ON r.CodCompromiso=c.CodCompromiso		
			GROUP BY
				 c.CodCentroCosto
				,c.CodPresupuesto
				,c.CodRubro	
		) Table1	
		INNER JOIN PresupuestoAnualDetalle pd
			ON Table1.CodPresupuesto=pd.CodPresupuesto 
			AND Table1.CodRubro=pd.CodRubro 
			AND Table1.CodCentroCosto=pd.CodCentroCosto
	
	-- Recalculo los porcentajes de los rubros del presupuesto
	EXEC spPresupuestoAnualDetalle @OP='RecalcularPorcentajes'
	
	
	--------Select * from RegistroINFORDetalle WHERE CodCompromiso_Usuario IS NOT NULL
	--------Select * from Compromiso
	--------ROLLBACK TRANSACTION
	--------RETURN 0
	
	COMMIT TRANSACTION			
	RETURN 0
END

/*****     REVERTIR EL CRUCE ENTRE UN REGISTRO Y UN COMPROMISO ESPECIFICO  *****/
IF @OP = 'REVERTIR_CruceRegistroYCompromiso'
BEGIN
	BEGIN TRANSACTION
	
	-- Verifico que el Registro Exista
	IF NOT EXISTS (SELECT * FROM RegistroINFORDetalle WHERE CodRegistro=@CodRegistro)
	BEGIN
		SET @AUX='El Registro '+@CodRegistro+' NO Existe.'	
		RAISERROR(@AUX,16,1);
		return 1
	END
	
	-- Verifico que el Registro Haya sido Cruzado con un compromiso
	IF EXISTS (SELECT * FROM RegistroINFORDetalle WHERE CodRegistro=@CodRegistro AND CodCompromiso IS NULL)
	BEGIN
		SET @AUX='El Registro '+@CodRegistro+' No ha sido cruzado con ningun compromiso.'	
		RAISERROR(@AUX,16,1);
		return 1
	END
	
	-- Verifico que el Periodo este activo
	IF EXISTS (SELECT * FROM PresupuestoAnualPeriodo pap inner join RegistroINFORDetalle reg on pap.Periodo=reg.Periodo WHERE CodRegistro=@CodRegistro AND pap.Activo=0)
	BEGIN
		SELECT @AUX='El Registro '+@CodRegistro+' pertenece al periodo '+pap.Periodo+'. Este Periodo NO esta activo. Verifique' FROM PresupuestoAnualPeriodo pap inner join RegistroINFORDetalle reg on pap.Periodo=reg.Periodo WHERE CodRegistro=@CodRegistro
		RAISERROR(@AUX,16,1);
		return 1
	END
	
	-- Le SUMO al saldo del compromiso el valor del registro
	UPDATE 
		c
	SET 
		 c.SaldoActualCompromiso=c.SaldoActualCompromiso+r.Valor
		,c.FechaUltMod=GETDATE()
	FROM
		Compromiso c
		inner join RegistroINFORDetalle r
			ON c.CodCompromiso=r.CodCompromiso	
			and r.CodRegistro=@CodRegistro	
	
	-- RESTO el valor del registro al valorFacturado del Presupuesto-rubro-CentroCosto correspondiente al compromiso
	UPDATE 
		pd
	SET 
		pd.ValorFacturado=pd.ValorFacturado-rd_.Valor
	FROM
		PresupuestoAnualDetalle pd
		INNER JOIN
			(
				SELECT rd.Valor AS Valor,c.CodPresupuesto,c.CodRubro,c.CodCentroCosto
				FROM
					RegistroINFORDetalle rd
					INNER JOIN 
					(
						select 
							 comp.CodCompromiso
							,comp.CodPresupuesto
							,comp.CodRubro
							,CASE WHEN cc.CodCentroCostoSuperior IS NOT NULL THEN cc.CodCentroCostoSuperior ELSE cc.CodCentroCosto END AS CodCentroCosto					
						from 
							Compromiso comp
							inner join CentroCosto cc
								on comp.CodCentroCosto=cc.CodCentroCosto				
					) c
						ON rd.CodCompromiso=c.CodCompromiso
						AND rd.CodRegistro=@CodRegistro
					INNER JOIN PresupuestoAnualDetalle pd
						ON c.CodPresupuesto=pd.CodPresupuesto AND c.CodRubro=pd.CodRubro AND c.CodCentroCosto=pd.CodCentroCosto
				WHERE
					rd.CodRegistro=@CodRegistro
			) AS rd_
			
				ON pd.CodPresupuesto=rd_.CodPresupuesto AND pd.CodRubro=rd_.CodRubro AND pd.CodCentroCosto=rd_.CodCentroCosto
				
	-- Recalculo los porcentajes de los rubros del presupuesto
	EXEC spPresupuestoAnualDetalle @OP='RecalcularPorcentajes'
	
	-- Grabo la accion en el log
	SELECT @AUX='Codigo registro: '+CodRegistro+'. Codigo Compromiso: '+CodCompromiso+'. 
Motivo de la Reversion: '+ISNULL(@ParamAuxiliar,'')
	FROM RegistroINFORDetalle
	where CodRegistro=@CodRegistro
	EXEC dbo.spSeguridadLogEventos_Insert @Evento='REVERSION CRUCE REGISTRO CONTABLE Y COMPROMISO',@Detalle=@AUX
	
	-- Limpio los campos que referencian el codigo del compromiso en el registro
	UPDATE RegistroINFORDetalle
	SET CodCompromiso=null,CodCompromiso_FechaGrab=null, CodCompromiso_Usuario=null
	where CodRegistro=@CodRegistro;
	
	COMMIT TRANSACTION
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ISNULL(ERROR_PROCEDURE(),OBJECT_NAME(@@PROCID)),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
